package com.ruoyi.common.utils;

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

public class ReduceImageSaturation {
    public static void main(String[] args) {
        try {
            // 加载图片
            File input = new File("D:\\BaiduNetdiskDownload\\Black\\Black\\IMG_Black_0001_SC\\IMG_Black_0001_SC.jpg"); // 替换为你的图片路径
            BufferedImage image = ImageIO.read(input);

            // 降低颜色的色彩（饱和度）
            BufferedImage output = reduceSaturation(image, 0.45f); // 调整 0.5f 为目标饱和度比例

            // 保存结果
            File outputFile = new File("C:\\Users\\lenovo\\Desktop\\水彩\\output.jpg");
            ImageIO.write(output, "jpg", outputFile);

            System.out.println("处理完成，保存为 output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 降低图像的饱和度
     * @param image 原始图像
     * @param saturationFactor 饱和度比例（0.0-1.0）
     * @return 处理后的图像
     */
    public static BufferedImage reduceSaturation(BufferedImage image, float saturationFactor) {
        int width = image.getWidth();
        int height = image.getHeight();

        BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                // 获取像素的 RGB 值
                int rgb = image.getRGB(x, y);

                // 转换为 HSB
                float[] hsb = Color.RGBtoHSB(
                        (rgb >> 16) & 0xFF, // Red
                        (rgb >> 8) & 0xFF,  // Green
                        rgb & 0xFF,         // Blue
                        null
                );

                // 降低饱和度
                hsb[1] *= saturationFactor;
                hsb[1] = Math.max(0.0f, Math.min(1.0f, hsb[1])); // 确保在 [0, 1] 范围内

                // 转回 RGB
                int newRgb = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);
                output.setRGB(x, y, newRgb);
            }
        }

        return output;
    }
}

